﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using condortravel.operaciones.core.DataModel;
using System.Data.Linq;

namespace condortravel.operaciones.persistence.operacionesImpl
{
    public class ProgramacionDAOImpl : condortravel.operaciones.persistence.Impl.GenericDAO<Tb_ServiciosProgramado, long>
    {
        #region CRUD
        /// <summary>
        /// 
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        public override Tb_ServiciosProgramado update(Tb_ServiciosProgramado entity)
        {
            Tb_ServiciosProgramado servicioProgramado;
            using (ImpersonationHelper imp = new ImpersonationHelper(this.Impersonation.User, this.Impersonation.Domain, this.Impersonation.Password))
            {
                if (IsImpersonate)
                {
                    if (!imp.ImpersonateUser())
                    {
                        throw new Exception("The Impersonate has failed");
                    }

                }

                using (DataContext dataContext = this.getInstanceDataContextFactory())
                {
                    servicioProgramado = dataContext.GetTable<Tb_ServiciosProgramado>().Where(p => p.programacion_ID == entity.programacion_ID).Single();
                    //servicioProgramado.descripcion = entity.descripcion;
                    //servicioProgramado.DetalleReserva_ID = entity.DetalleReserva_ID;
                    servicioProgramado.estadoProgramacion_ID = entity.estadoProgramacion_ID;
                    //servicioProgramado.fechaProgramacionFin = entity.fechaProgramacionFin;
                    //servicioProgramado.fechaProgramacionInicio = entity.fechaProgramacionInicio;
                    //servicioProgramado.ItinerarioViajero_ID = entity.ItinerarioViajero_ID;
                    //servicioProgramado.nroEventos = entity.nroEventos;
                    //servicioProgramado.programacion_ID = entity.programacion_ID;
                    //servicioProgramado.tipoProgramacion = entity.tipoProgramacion;
                    dataContext.SubmitChanges();
                }
            }
            return servicioProgramado;
            

        }

        public override Tb_ServiciosProgramado getByID(long id)
        {
            using (ImpersonationHelper imp = new ImpersonationHelper(this.Impersonation.User, this.Impersonation.Domain, this.Impersonation.Password))
            {
                if (IsImpersonate)
                {
                    if (!imp.ImpersonateUser())
                    {
                        throw new Exception("The Impersonate has failed");
                    }

                }
                using (DataContext dataContext = this.getInstanceDataContextFactory())
                {
                    DataLoadOptions options = new DataLoadOptions();
                    options.LoadWith<Tb_ServiciosProgramado>(s => s.Tb_Estado_Programacion);
                    options.LoadWith<Tb_ServiciosProgramado>(s => s.Tb_ItinerarioViajero);
                    options.LoadWith<Tb_ServiciosProgramado>(s => s.Tb_DetalleReserva);
                    options.LoadWith<Tb_DetalleReserva>(s => s.Tb_TipoReserva);
                    options.LoadWith<Tb_ItinerarioViajero>(s => s.Tb_Agencia);
                    options.LoadWith<Tb_ItinerarioViajero>(s => s.Tb_Agente);               
                    dataContext.LoadOptions = options;
                    return (from p in dataContext.GetTable<Tb_ServiciosProgramado>()
                            where p.programacion_ID==id
                            select p).SingleOrDefault<Tb_ServiciosProgramado>();

                }
            }
        }

        public override void delete(long pk)
        {
            throw new NotImplementedException();
        }

        public List<Tb_ServiciosProgramado> getListProgramaciones(long codigoItinerario)
        {
            using (ImpersonationHelper imp = new ImpersonationHelper(this.Impersonation.User, this.Impersonation.Domain, this.Impersonation.Password))
            {
                if (IsImpersonate)
                {
                    if (!imp.ImpersonateUser())
                    {
                        throw new Exception("The Impersonate has failed");
                    }

                }
                using (DataContext dataContext = this.getInstanceDataContextFactory())
                {
                    DataLoadOptions options = new DataLoadOptions();
                    options.LoadWith<Tb_ServiciosProgramado>(s => s.Tb_Estado_Programacion);
                    options.LoadWith<Tb_ServiciosProgramado>(s => s.Tb_ItinerarioViajero);
                    options.LoadWith<Tb_ServiciosProgramado>(s => s.Tb_DetalleReserva);
                    options.LoadWith<Tb_DetalleReserva>(s => s.Tb_TipoReserva);
                    dataContext.LoadOptions = options;

                    return (from p in dataContext.GetTable<Tb_ServiciosProgramado>()
                            where p.itinerarioViajero_ID == codigoItinerario
                            select p).ToList<Tb_ServiciosProgramado>();
                }
            }
        }
        #endregion
    }

}
